<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    // 封装集合类
    function Set() {
        // 属性
        this.items = {}

        // 方法
        // add方法
        Set.prototype.add = function (value) {
            // 判断当前集合中是否包含了该元素
            if (this.has(value)) {
                return false
            }

            // 将元素添加到集合中
            this.items[value] = value
            return true
        }

        // has方法
        Set.prototype.has = function (value) {
            return this.items.hasOwnProperty(value)
        }

        // remove方法
        Set.prototype.remove = function (value) {
            // 1.判断该集合是否包含该元素
            if (!this.has(value)) {
                return false
            }

            // 2.将该元素从属性中删除
            delete this.items[value]
            return true
        }

        // clear方法
        Set.prototype.clear = function () {
            this.items = []
        }

        // size方法
        Set.prototype.size = function () {
            return Object.keys(this.items).length
        }

        // 获取集合中所有的值
        Set.prototype.values = function () {
            return Object.keys(this.items)
        }


        // 集合间的操作
        // 并集
        Set.prototype.union = function (otherSet) {
            // this: 集合对象a
            // otherSet: 集合对象b

            // 1.创建新的集合
            var unionSet = new Set()

            // 2.将集合a中的所有元素添加到新集合中
            var values = this.values()
            for (var i = 0; i < values.length; i++) {
                unionSet.add(values[i])
            }

            // 3.取出集合b中的元素，判断是否需要添加到新集合
            values = otherSet.values()
            for (var i = 0; i < values.length; i++) {
                unionSet.add(values[i])
            }

            return unionSet
        }


        // 交集
        Set.prototype.intersection = function (otherSet) {
            // 1.创建新的集合
            var intersectionSet = new Set()

            // 2.从A中取出一个元素，判断是否同时存在于集合B， 存放在新集合中
            var values = this.values()
            for (var i = 0; i < values.length; i++) {
                var item = values[i]
                if (otherSet.has(item)) {
                    intersectionSet.add(item)
                }
            }
            return intersectionSet
        }


        // 差集
        Set.prototype.difference = function (otherSet) {
            // 1.创建新的集合
            var difference = new Set()

            // 2.取出A中的元素，判断是否存在于集合B中，不存在B中，则添加到新集合中
            var values = this.values()
            for (var i = 0; i < values.length; i++) {
                var item = values[i]
                if (!otherSet.has(item)) {
                    difference.add(item)
                }
            }
            return difference
        }


        // 子集
        Set.prototype.subset = function (otherSet) {
            var values = this.values()
            for (var i = 0; i < values.length; i++) {
                var item = values[i]
                if (!otherSet.has(item)) {
                    return false
                }
            }
            return true
        }
    }


    // 测试Set类
    //  1.创建Set类对象
    // var set = new Set()

    // 2.添加元素
    // alert(set.add('abc'))
    // alert(set.add('abc'))
    // alert(set.add('cba'))
    // alert(set.add('nba'))
    // alert(set.add('mba'))
    // alert(set.values())

    // 3.删除元素
    // alert(set.remove('mba'))
    // alert(set.remove('mba'))
    // alert(set.values())

    // 4.has方法
    // alert(set.has('abc'))

    // 5.获取元素的个数
    // alert(set.size())
    // set.clear()
    // alert(set.size())

    // 1.创建两个集合，并且添加元素
    var setA = new Set()
    // setA.add('abc')
    setA.add('cba')
    setA.add('nba')
    var setB = new Set()
    setB.add('aaa')
    setB.add('nba')
    setB.add('cba')

    // 2.求两个集合的并集
    // var unionSet = setA.union(setB)
    // alert(unionSet.values())

    // 3.交集
    // var intersectionSet = setA.intersection(setB)
    // alert(intersectionSet.values())

    // 4.差集
    // var difference = setA.difference(setB)
    // alert(difference.values())


    // 5.子集
    alert(setA.subset(setB))
</script>
</body>
</html>
